package org.example;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.IoUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.example.service.AvatarToken;
import org.example.service.MyClient;

import javax.imageio.ImageIO;
import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.CompletableFuture;

public class WebsocketClient {
    //    dN2Gen8K
//    a8f9d149ee7544188a3a4d00399d266b
    public static String appid = "xxxxxxxx"; //申请的appid
    public static String appKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //appid对应的key
    public static String vcn = "xxxxxxxxxxxxxxxx";//发音人id
    public static String anchorId = "xxxxxxxx";//形象id
    public static String version = "v1";
    public static String token_url = "https://avatar-hci.xfyousheng.com/v1/token";//公网鉴权地址
    public static String ws_url = "wss://avatarws.xfyousheng.com/v1/link";//公网交互地址


    public static void main(String[] args) {
        try {
            //获取token
            AvatarToken at = new AvatarToken();
            String token = at.getToken2(token_url, appid, appKey);
            System.out.println("token:"+token);
            if (token.equals("")) {
                System.out.println("get token error");
                return;
            }
            String str = "token=" + token + "&anchorId=" + anchorId + "&vcn=" + vcn + "&timestamp="
                    + String.valueOf(System.currentTimeMillis()) + "&version=" + version + "&appid=" + appid + "&uid=123456";

            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            MyClient client = new MyClient();
            System.out.println("ws_url+signa=:"+ws_url+"?signa="+Base64.encode(str));
            container.connectToServer(client, new URI(ws_url + "?signa=" + Base64.encode(str)));

            Map<String,Object> extend = new HashMap<>();
//            extend.put("mask","[0,0,1080,1920]");
//            extend.put("scale","1");
//            extend.put("vertical","165");
//            extend.put("alpha",true);
//            extend.put("bitrate","5000000");
//            String extendjson = JSONUtil.toJsonStr(extend);

            Map<String, Object> map = new HashMap<>();
//            map.put("base",base);
//            map.put("anchorId", anchorId);
//            map.put("token", token);
            map.put("vcn", vcn);
            map.put("type", "0");
            map.put("width", "720");
            map.put("height", "1280");
            map.put("bgType",0);
            String base64Image = null;
            /**获取图片Base64的数据**/
//            try {
//                File imageFile = new File("src/main/resources/tupian2.png");// 将这里的路径替换为实际的图片路径
//                BufferedImage bufferedImage = ImageIO.read(imageFile);
//                ByteArrayOutputStream baos = new ByteArrayOutputStream();
//                ImageIO.write(bufferedImage, "png", baos); // 可以根据实际需要修改图片格式，如"jpg"等
//                byte[] imageBytes = baos.toByteArray();
//                base64Image = Base64.encode(imageBytes);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//            map.put("bgData",base64Image);
//            map.put("bgUrl", "https://jfvideo-jk.zgpajf.com.cn/img/pajk/720_1280_1.png");
            map.put("pushMode", "6");
//            map.put("customerInterrupt", true);
//            map.put("cid", "987654321");
//            map.put("frameStatus",0);
//            map.put("data","我是虚拟人超哥");
            map.put("extend",extend);
            map.put("subtitle",true);

            Map<String,Object> subtitleExtend = new HashMap<String,Object>();
//            map.put("subtitleExtend",subtitleExtend);

            // 初始化
            client.send(JSONUtil.toJsonStr(map));
            map.clear();

            Thread.sleep(1000);
            map.put("type","-1");
            client.send(JSONUtil.toJsonStr(map));
            map.clear();

            //发送ping帧
            Timer timer = new Timer();
            CompletableFuture.runAsync(()->{
                Map<String,Object> map1 = new HashMap<>();
                map1.put("type","-99");
                TimerTask timeoutTask = new TimerTask() {
                    @Override
                    public void run() {
                        client.send(JSONUtil.toJsonStr(map1));
                    }
                };
                timer.scheduleAtFixedRate(timeoutTask, 0,9000);
                System.out.println("进入定时器内部");
            });

//            Thread.sleep(15000);


//            for (int i = 1; i < 100; i++) {
//                Thread.sleep(200);
//                map.put("vcn", vcn);
//                map.put("sid", "12345");
//                map.put("type", "3");
//                map.put("data", Base64.encode("<speak>"+i+"</speak>"));
////            map.put("data", "生酮饮食是一种高脂肪、低碳水化合物、适量蛋白质的饮食模式。");
//
//                map.put("frameStatus",2);
//                map.put("customerInterrupt",true);
//                map.put("authId","c89317754");
//                System.out.println("接口参数格式："+JSONUtil.toJsonStr(map));
//                client.send(JSONUtil.toJsonStr(map));
//                map.clear();
//            }
//            map.put("sid","12345");
//            map.put("type","-1");
//            map.put("cid","asdfgh");
//            System.out.println("接口参数格式:"+ JSONUtil.toJsonStr(map));
//            client.send(JSONUtil.toJsonStr(map));
//            map.clear();



            map.put("vcn", vcn);
            map.put("sid", "12345");
            map.put("type", "2");
            map.put("data", Base64.encode("1科大讯飞怎么样"));
//            map.put("data", Base64.encode("我想办理公路用地"));
            map.put("width",720);
            map.put("height",1280);
            map.put("frameStatus",2);
//            map.put("customerInterrupt",true);
            map.put("authId","c89317754");
            System.out.println("接口参数格式："+JSONUtil.toJsonStr(map));
            client.send(JSONUtil.toJsonStr(map));
            map.clear();

            Thread.sleep(500);

//            map.put("type","-1");
//            client.send(JSONUtil.toJsonStr(map));
//            map.clear();




//            map.put("vcn", vcn);
//            map.put("sid", "12345");
//            map.put("type", "3");
//            map.put("data", Base64.encode("2开始燃烧脂肪作为主要能量来源，"));
//            map.put("width",720);
//            map.put("height",1280);
//            map.put("frameStatus",2);
////            map.put("customerInterrupt",true);
//            map.put("authId","c89317754");
//            client.send(JSONUtil.toJsonStr(map));
//            map.clear();
//
//
//
//            map.put("vcn", vcn);
//            map.put("sid", "12345");
//            map.put("type", "3");
//            map.put("data", Base64.encode("3而非碳水化合物。"));
//            map.put("width",720);
//            map.put("height",1280);
//            map.put("frameStatus",2);
////            map.put("customerInterrupt",true);
//            map.put("authId","c89317754");
//            client.send(JSONUtil.toJsonStr(map));
//            map.clear();
//            Thread.sleep(500);
////            map.put("sid","12345");
////            map.put("type","-1");
////            map.put("cid","asdfgh");
////            System.out.println("接口参数格式:"+ JSONUtil.toJsonStr(map));
////            client.send(JSONUtil.toJsonStr(map));
////            map.clear();
//
//
//            map.put("vcn", vcn);
//            map.put("sid", "12345");
//            map.put("type", "3");
//            map.put("data", Base64.encode("4这种饮食方式常被用于减肥和控制某些疾病，"));
//            map.put("width",720);
//            map.put("height",1280);
//            map.put("frameStatus",2);
////            map.put("customerInterrupt",true);
//            map.put("authId","c89317754");
//            client.send(JSONUtil.toJsonStr(map));
//            map.clear();
//
//
//            map.put("vcn", vcn);
//            map.put("sid", "12345");
//            map.put("type", "3");
//            map.put("data", Base64.encode("5如癫痫。"));
//            map.put("width",720);
//            map.put("height",1280);
//            map.put("frameStatus",2);
////            map.put("customerInterrupt",true);
//            map.put("authId","c89317754");
//            client.send(JSONUtil.toJsonStr(map));
//            map.clear();
//
//            map.put("vcn", vcn);
//            map.put("sid", "12345");
//            map.put("type", "3");
//            map.put("data", Base64.encode("6<speak>6生酮饮食是一种高脂肪、低碳水化合物、适量蛋白质的饮食模式。</speak>"));
//            map.put("width",720);
//            map.put("height",1280);
//            map.put("frameStatus",2);
////            map.put("customerInterrupt",true);
//            map.put("authId","c89317754");
//            System.out.println("接口参数格式："+JSONUtil.toJsonStr(map));
//            client.send(JSONUtil.toJsonStr(map));
//            map.clear();
//
//            map.put("vcn", vcn);
//            map.put("sid", "12345");
//            map.put("type", "3");
//            map.put("data", Base64.encode("7<speak>7生酮饮食是一种高脂肪、低碳水化合物、适量蛋白质的饮食模式。</speak>"));
//            map.put("cid", "asdfgh");
//            map.put("width",720);
//            map.put("height",1280);
//            map.put("frameStatus",2);
////            map.put("customerInterrupt",true);
//            map.put("authId","c89317754");
//            System.out.println("接口参数格式："+JSONUtil.toJsonStr(map));
//            client.send(JSONUtil.toJsonStr(map));
////            Thread.sleep(500);
//            map.clear();
//
//            map.put("vcn", vcn);
//            map.put("sid", "12345");
//            map.put("type", "3");
////            map.put("data", Base64.encode("<speak>生酮饮食是一种高脂肪、低碳水化合物、适量蛋白质的饮食模式。</speak>"));
//            map.put("cid", "asdfgh");
//            map.put("width",720);
//            map.put("height",1280);
//            map.put("frameStatus",2);
//            map.put("customerInterrupt",true);
//            map.put("authId","c89317754");
//            System.out.println("接口参数格式："+JSONUtil.toJsonStr(map));
//            client.send(JSONUtil.toJsonStr(map));
////            Thread.sleep(500);
//            map.clear();





            Thread.sleep(30000);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
